package it.scambiocorse.ajax;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import it.scambiocorse.dao.AreaService;
import it.scambiocorse.dao.ClienteService;
import it.scambiocorse.dao.FeedbackService;
import it.scambiocorse.dao.ServizioService;
import it.scambiocorse.dao.UtenteService;
import it.scambiocorse.model.AutistaType;
import it.scambiocorse.model.JTableType;
import it.scambiocorse.model.ServizioJson;
import it.scambiocorse.model.ServizioType;
import it.scambiocorse.model.SorgenteType;
import it.scambiocorse.model.UtenteType;
import it.scambiocorse.utils.Costanti;
import it.scambiocorse.utils.LabelValueBean;
import it.scambiocorse.utils.Utils;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.springframework.web.servlet.mvc.multiaction.*;
import org.apache.log4j.Logger;
import org.springframework.web.servlet.ModelAndView;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

public class AjaxControllerPub extends  MultiActionController {
	private ServizioService servizioDao = null;
	private AreaService areaDao = null;
	private UtenteService utenteDao = null;
	private ClienteService clienteDao = null;
	private FeedbackService feedbackDao = null;
	

	public AreaService getAreaDao() {
		return areaDao;
	}
	public void setAreaDao(AreaService areaDao) {
		this.areaDao = areaDao;
	}
	public ServizioService getServizioDao() {
		return servizioDao;
	}
	public void setServizioDao(ServizioService servizioDao) {
		this.servizioDao = servizioDao;
	}
	public UtenteService getUtenteDao() {
		return utenteDao;
	}
	public void setUtenteDao(UtenteService utenteDao) {
		this.utenteDao = utenteDao;
	}
	public ClienteService getClienteDao() {
		return clienteDao;
	}
	public void setClienteDao(ClienteService clienteDao) {
		this.clienteDao = clienteDao;
	}	




	public FeedbackService getFeedbackDao() {
		return feedbackDao;
	}
	public void setFeedbackDao(FeedbackService feedbackDao) {
		this.feedbackDao = feedbackDao;
	}




	final Logger logger = Logger.getLogger(getClass());


	
	@Override 
	public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
			return super.handleRequest(request, response);
	}
	

	public ModelAndView loadServizi(HttpServletRequest request, HttpServletResponse response, JTableType jTfilter) throws Exception {
		UtenteType dettaglio =  null;
		logger.warn("Metodo -> loadServizi");

		try {
			HttpSession session = request.getSession(false);
			if (Utils.isNull(session) || session.getAttribute("dettaglio") == null) {
				session = request.getSession(true);
				logger.warn("Sessione Scaduta");
				return new ModelAndView("expired");
			} else {
				dettaglio = (UtenteType)session.getAttribute("dettaglio");
			}
			
				String dataIniz = request.getParameter("dataIniz");
				String dataFine = request.getParameter("dataFine");
				HashMap j =  servizioDao.listaServiziPubJTable(dataIniz, dataFine, jTfilter );
				
				sendJson(response, j);
				

				
				return null;
				
		}catch (Exception e) {
			logger.error("SI E' VERIFICATO UN ERRORE");
			logger.error("Utente: "+((dettaglio != null) ? ""+dettaglio.getIdUser(): "N/A" ));
			logger.error(e);
			return new ModelAndView("gestioneErrore").addObject(e);
		}
	}
	
	
	
	
	public ModelAndView loadServiziIN(HttpServletRequest request, HttpServletResponse response, JTableType jTfilter) throws Exception {
		UtenteType dettaglio =  null;
		logger.warn("Metodo -> loadServiziIN");

		try {
			HttpSession session = request.getSession(false);
			if (Utils.isNull(session) || session.getAttribute("dettaglio") == null) {
				session = request.getSession(true);
				logger.warn("Sessione Scaduta");
				return new ModelAndView("expired");
			} else {
				dettaglio = (UtenteType)session.getAttribute("dettaglio");
			}
			
				String dataIniz = request.getParameter("dataIniz");
				String dataFine = request.getParameter("dataFine");
				HashMap j =  servizioDao.listaServiziPubJTableIN(dettaglio.getIdUser(),dataIniz, dataFine, jTfilter );
				
				sendJson(response, j);
				

				
				return null;
				
		}catch (Exception e) {
			logger.error("SI E' VERIFICATO UN ERRORE");
			logger.error("Utente: "+((dettaglio != null) ? ""+dettaglio.getIdUser(): "N/A" ));
			logger.error(e);
			return new ModelAndView("gestioneErrore").addObject(e);
		}
	}
	
	
	public ModelAndView loadServiziOUT(HttpServletRequest request, HttpServletResponse response, JTableType jTfilter) throws Exception {
		UtenteType dettaglio =  null;
		logger.warn("Metodo -> loadServiziOUT");

		try {
			HttpSession session = request.getSession(false);
			if (Utils.isNull(session) || session.getAttribute("dettaglio") == null) {
				session = request.getSession(true);
				logger.warn("Sessione Scaduta");
				return new ModelAndView("expired");
			} else {
				dettaglio = (UtenteType)session.getAttribute("dettaglio");
			}
			
				String dataIniz = request.getParameter("dataIniz");
				String dataFine = request.getParameter("dataFine");
				HashMap j =  servizioDao.listaServiziPubJTableOUT(dettaglio.getIdUser(),dataIniz, dataFine, jTfilter );
				
				sendJson(response, j);
				
				return null;
				
		}catch (Exception e) {
			logger.error("SI E' VERIFICATO UN ERRORE");
			logger.error("Utente: "+((dettaglio != null) ? ""+dettaglio.getIdUser(): "N/A" ));
			logger.error(e);
			return new ModelAndView("gestioneErrore").addObject(e);
		}
	}
	
	
	
	
	public ModelAndView loadFeedback(HttpServletRequest request, HttpServletResponse response, JTableType jTfilter) throws Exception {
		UtenteType dettaglio =  null;
		logger.warn("Metodo -> loadFeedback");

		try {
			HttpSession session = request.getSession(false);
			if (Utils.isNull(session) || session.getAttribute("dettaglio") == null) {
				session = request.getSession(true);
				logger.warn("Sessione Scaduta");
				return new ModelAndView("expired");
			} else {
				dettaglio = (UtenteType)session.getAttribute("dettaglio");
			}
			
				String dataIniz = request.getParameter("dataIniz");
				String dataFine = request.getParameter("dataFine");
				HashMap j =  feedbackDao.listaFeedbackJTable(dettaglio.getIdUser(), jTfilter );
				
				sendJson(response, j);
				

				
				return null;
				
		}catch (Exception e) {
			logger.error("SI E' VERIFICATO UN ERRORE");
			logger.error("Utente: "+((dettaglio != null) ? ""+dettaglio.getIdUser(): "N/A" ));
			logger.error(e);
			return new ModelAndView("gestioneErrore").addObject(e);
		}
	}
	
	
	private void sendJson(HttpServletResponse response, HashMap j) throws IOException {
		Gson g = new GsonBuilder().setDateFormat("yyyy-MM-dd").create();
		response.setContentType("application/json");
		PrintWriter out = response.getWriter();
		out.print(g.toJson(j));
		out.flush();
		out.close();
		logger.warn("Procedo al invio di servizi JSON ");
	}
	
	private ModelAndView sessioneScaduta(HttpServletRequest request, HttpServletResponse response) throws Exception  {
		logger.debug("Sessione scaduta, procedo al redirect");
		return new ModelAndView("expired");
		
	}	
	
	
	
		

}
